Guest User

Untitled

a guest
Aug 28th, 2017
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.89 KB | None | 0 0
  1. open System
  2. open FSharp.Data
  3. open Newtonsoft.Json
  4. open System.Data.Entity
  5. open System.ComponentModel.DataAnnotations
  6.  
  7. let format (source:string, page, language, date:string) = String.Format(source, page, language, date)
  8.  
  9. [<CLIMutable>]
  10. type Repo = {
  11.     [<Key>]
  12.     id:int;
  13.     language:string;
  14.     name:string;
  15.     full_name:string;
  16.     html_url:string;
  17.     description:string;
  18.     fork:bool;
  19.     created_at:DateTime;
  20.     updated_at:DateTime;
  21.     pushed_at:DateTime;
  22.     size:int;
  23.     stargazers_count:int;
  24.     watchers_count:int;
  25.     has_issues:bool;
  26.     has_projects:bool;
  27.     has_downloads:bool;
  28.     has_wiki:bool;
  29.     has_pages:bool;
  30.     forks_count:int;
  31.     open_issues_count:int;
  32.     forks:int;
  33.     open_issues:int;
  34.     watchers:int;
  35. }
  36.  
  37. type GithubResponse = {
  38.     total_count:int;
  39.     incomplete_results:bool;
  40.     items:Repo[];
  41. }
  42.  
  43. type RepositoryContext() =
  44.     inherit DbContext()
  45.          [<DefaultValue>] val mutable repositories: DbSet<Repo>
  46.          member this.Repositories with get() = this.repositories and set f = this.repositories <- f
  47.  
  48. let context = new RepositoryContext()
  49. let connectionString = "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Github;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
  50. context.Database.Connection.ConnectionString <- connectionString
  51.  
  52. let addItem (item:Repo) =
  53.     context.Repositories.Add(item) |> ignore
  54.     context.SaveChanges() |> ignore
  55.  
  56. type GithubParser (language:string) =
  57.     let userAgent = "extremecodetv (Microsoft Windows 10.0.15063 ; x64; ru-RU; Octokit 0.24.0)"
  58.     let searchUrl = "https://api.github.com/search/repositories?page={0}&per_page=1000&order=desc&q=language:{1}+created:{2}..{2}"
  59.     let event = new Event<_>()
  60.     let span = TimeSpan.FromDays(1.0)
  61.  
  62.     let rec loader (date:DateTime) =
  63.         async {
  64.             if date.Year.Equals 2016 then
  65.                 Console.WriteLine("Done")
  66.  
  67.             let url = format (searchUrl, 1, language, date.ToString "yyyy-MM-dd" )
  68.             do! Async.Sleep 6000 //10 requests in 1 minute
  69.             Console.WriteLine (date.ToString "yyyy-MM-dd")
  70.             try
  71.                 let! source = Http.AsyncRequestString(url, headers = ["User-Agent", userAgent] )    
  72.  
  73.                 let response = JsonConvert.DeserializeObject<GithubResponse> source            
  74.                 for repo in response.items do
  75.                     event.Trigger repo
  76.             with
  77.                 | Failure msg -> loader date
  78.  
  79.             loader (date - span)
  80.         } |> Async.RunSynchronously
  81.  
  82.     member this.Run(date:DateTime) = loader date
  83.     member this.Abort() = Async.CancelDefaultToken
  84.     member this.NewData = event.Publish
  85.  
  86. let parser = new GithubParser("CSharp")
  87. parser.NewData
  88.     |> Event.map(fun x -> addItem(x))
  89.     |> ignore
  90.  
  91. parser.Run(DateTime.Now)
Advertisement
Add Comment
Please, Sign In to add comment